package com.sxpi.order.async;

import cn.hutool.core.map.MapUtil;
import com.sxpi.order.mode.event.OrderEvent;
import com.sxpi.order.vo.MessageOrderVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * @Author: 董伟豪
 * @Date: 2022/10/30 11:23
 */
@Component
@Slf4j
public class MessageAsyncService {

    @Autowired
    private ApplicationContext applicationContext;

    /**
     * 消耗的本地线程池。如果并发很大的话，那么久势必争取cpu执行资源，就造成一些tomcat线程的阻塞和挂起。
     * - @async 容错性必须自己处理
     * - @async 没有高可用，也必须自己处理
     * - @async 也没有回执和确认，你执行异步你是没有办法立即给与回馈。
     * - @async 没有办法实现多端处理
     *
     * 但是如果有一种像nacos和sentinel这种外部服务器的方式就可以解决了，那么就是消息队列
     * 就算到后面的xxb-job那些定时任务也是一样的道理，就是把服务分离，定时任务在xxb-job的服务端，而我这里只是需要定任务就行
     * @param paramsResult
     */
    @Async
    public void saveOrderMessage(Map<String,Object> paramsResult){
        log.info("3................发送订单消息了.....................22222");
        // System.out.println(1/0);

        Long orderId = MapUtil.getLong(paramsResult, "id");
        Long userId = MapUtil.getLong(paramsResult, "userid");
        String username = MapUtil.getStr(paramsResult, "username");
        String avatar = MapUtil.getStr(paramsResult, "avatar");
        Long opid = MapUtil.getLong(paramsResult, "opid");
        String title = MapUtil.getStr(paramsResult, "title");
        String img = MapUtil.getStr(paramsResult, "img");
        String description = MapUtil.getStr(paramsResult, "description");
        String realprice = MapUtil.getStr(paramsResult, "realprice");

        MessageOrderVo messageOrderVo = new MessageOrderVo();
        messageOrderVo.setContent("保存了订单");
        // 把map属性传进去，然后把id取出来
        messageOrderVo.setOrderId(orderId);
        messageOrderVo.setUserId(userId);
        messageOrderVo.setUsername(username);
        messageOrderVo.setAvatar(avatar);
        messageOrderVo.setOpid(opid);
        messageOrderVo.setTitle(title);
        messageOrderVo.setImg(img);
        messageOrderVo.setDescription(description);
        messageOrderVo.setRealprice(realprice);


        // 这里的监听器依旧是保存信息
        OrderEvent orderEvent = new OrderEvent(applicationContext);
        orderEvent.setMessageOrderVo(messageOrderVo);
        applicationContext.publishEvent(orderEvent);
    }

}
